<?php
/**
 * 用户组控制器
 * RESTful API 实现用户组管理功能
 */

declare (strict_types = 1);

namespace app\controller\user;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;
use app\common\DataPermissionHelper;

class Group extends BaseController
{
    /**
     * 获取用户组列表
     * GET /api/user/group/list
     */
    public function index()
    {
        try {
            $param = Request::param();
            $page = (int)($param['page'] ?? 1);
            $limit = (int)($param['limit'] ?? 20);
            $keywords = trim($param['keywords'] ?? '');
            $status = $param['status'] ?? '';
            
            // 权限检查：只有超级管理员才能查看所有用户组
            if (!$this->checkSuperAdmin()) {
                return $this->error('无权限查看用户组', 403);
            }
            
            // 构建查询条件
            $where = [];
            
            // 关键词搜索
            if (!empty($keywords)) {
                $where[] = ['title|desc', 'like', '%' . $keywords . '%'];
            }
            
            // 状态筛选
            if ($status !== '') {
                $where[] = ['status', '=', (int)$status];
            }
            
            // 查询用户组列表
            $query = Db::name('admin_group')
                ->where($where)
                ->order('create_time', 'asc');
                
            $total = $query->count();
            $groups = $query->page($page, $limit)->select()->toArray();
            
            // 处理数据格式
            foreach ($groups as &$group) {
                $group = $this->formatGroupData($group);
            }
            
            return $this->paginate($groups, $total, $page, $limit, '获取用户组列表成功');
        } catch (\Exception $e) {
            return $this->error('查询失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 格式化用户组数据
     */
    private function formatGroupData($group)
    {
        $group['create_time_format'] = $group['create_time'] ? date('Y-m-d H:i:s', $group['create_time']) : '';
        $group['update_time_format'] = $group['update_time'] ? date('Y-m-d H:i:s', $group['update_time']) : '';
        
        // 状态名称
        $statusNames = [
            0 => '禁用',
            1 => '正常'
        ];
        $group['status_name'] = $statusNames[$group['status']] ?? '未知';
        
        // 权限节点
        if (!empty($group['rules'])) {
            $rulesArray = explode(',', trim($group['rules'], ','));
            $group['rules_array'] = array_filter($rulesArray); // 过滤空元素
            $group['rules_count'] = count($group['rules_array']);
        } else {
            $group['rules_array'] = [];
            $group['rules_count'] = 0;
        }
        
        // 首页展示模块
        if (!empty($group['layouts'])) {
            $layoutsArray = explode(',', trim($group['layouts'], ','));
            $group['layouts_array'] = array_filter($layoutsArray); // 过滤空元素
            $group['layouts_count'] = count($group['layouts_array']);
        } else {
            $group['layouts_array'] = [];
            $group['layouts_count'] = 0;
        }
        
        return $group;
    }
    
    /**
     * 查看单个用户组详情
     * GET /api/user/group/{id}
     */
    public function read()
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);
            
            if ($id <= 0) {
                return $this->paramError('用户组ID不能为空');
            }
            
            // 权限检查
            if (!$this->checkSuperAdmin()) {
                return $this->error('无权限查看用户组', 403);
            }
            
            // 查询用户组详情
            $group = Db::name('admin_group')
                ->where('id', $id)
                ->find();
            
            if (empty($group)) {
                return $this->error('用户组不存在', 404);
            }
            
            $group = $this->formatGroupData($group);
            
            // 获取用户组的具体权限节点信息
            if (!empty($group['rules_array'])) {
                $group['rules_detail'] = Db::name('admin_rule')
                    ->whereIn('id', $group['rules_array'])
                    ->field('id, title, name, src, module')
                    ->select()
                    ->toArray();
            } else {
                $group['rules_detail'] = [];
            }
            
            // 获取使用该用户组的用户数量
            $group['user_count'] = Db::name('admin')
                ->where('group_id', $id)
                ->count();
            
            return $this->success($group, '获取用户组详情成功');
        } catch (\Exception $e) {
            return $this->error('查询失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 创建用户组
     * POST /api/user/group
     */
    public function save()
    {
        try {
            $param = Request::param();
            
            // 权限检查（只有超级管理员才能操作）
            if (!$this->checkSuperAdmin()) {
                return $this->error('只有系统超级管理员才有权限操作用户组！', 403);
            }
            
            // 数据验证
            $validate = $this->validateGroupData($param);
            if ($validate !== true) {
                return $this->paramError($validate);
            }
            
            // 检查用户组名称是否已存在
            $existGroup = Db::name('admin_group')
                ->where('title', trim($param['title']))
                ->find();
            
            if ($existGroup) {
                return $this->error('用户组名称已存在', 400);
            }
            
            // 处理权限规则字符串
            $rules = isset($param['rules']) && is_array($param['rules']) ? 
                     ',' . implode(',', array_filter($param['rules'])) . ',' : '';
            $layouts = isset($param['layouts']) && is_array($param['layouts']) ? 
                       ',' . implode(',', array_filter($param['layouts'])) . ',' : '';
            
            $data = [
                'title' => trim($param['title']),
                'status' => (int)($param['status'] ?? 1),
                'rules' => $rules,
                'layouts' => $layouts,
                'desc' => trim($param['desc'] ?? ''),
                'create_time' => time(),
                'update_time' => time()
            ];
            
            // 创建用户组
            $groupId = Db::name('admin_group')->insertGetId($data);
            
            return $this->created(['id' => $groupId], '用户组创建成功');
        } catch (\Exception $e) {
            return $this->error('创建失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 更新用户组
     * PUT /api/user/group/{id}
     */
    public function update()
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);
            
            if ($id <= 0) {
                return $this->paramError('用户组ID不能为空');
            }
            
            // 权限检查
            if (!$this->checkSuperAdmin()) {
                return $this->error('只有系统超级管理员才有权限操作用户组！', 403);
            }
            
            // 检查用户组是否存在
            $group = Db::name('admin_group')->where('id', $id)->find();
            if (empty($group)) {
                return $this->error('用户组不存在', 404);
            }
            
            // 数据验证
            $validate = $this->validateGroupData($param, $id);
            if ($validate !== true) {
                return $this->paramError($validate);
            }
            
            // 检查用户组名称是否已存在（排除自己）
            $existGroup = Db::name('admin_group')
                ->where('title', trim($param['title']))
                ->where('id', '<>', $id)
                ->find();
            
            if ($existGroup) {
                return $this->error('用户组名称已存在', 400);
            }
            
            // 处理权限规则字符串
            $rules = isset($param['rules']) && is_array($param['rules']) ? 
                     ',' . implode(',', array_filter($param['rules'])) . ',' : $group['rules'];
            $layouts = isset($param['layouts']) && is_array($param['layouts']) ? 
                       ',' . implode(',', array_filter($param['layouts'])) . ',' : $group['layouts'];
            
            $data = [
                'title' => trim($param['title']),
                'status' => (int)($param['status'] ?? $group['status']),
                'rules' => $rules,
                'layouts' => $layouts,
                'desc' => trim($param['desc'] ?? $group['desc']),
                'update_time' => time()
            ];
            
            // 更新用户组
            Db::name('admin_group')->where('id', $id)->update($data);
            
            return $this->updated(['id' => $id], '用户组更新成功');
        } catch (\Exception $e) {
            return $this->error('更新失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 删除用户组
     * DELETE /api/user/group/{id}
     */
    public function delete()
    {
        try {
            $param = Request::param();
            $id = (int)($param['id'] ?? 0);
            
            if ($id <= 0) {
                return $this->paramError('用户组ID不能为空');
            }
            
            // 权限检查
            if (!$this->checkSuperAdmin()) {
                return $this->error('只有系统超级管理员才有权限操作用户组！', 403);
            }
            
            // 检查用户组是否存在
            $group = Db::name('admin_group')->where('id', $id)->find();
            if (empty($group)) {
                return $this->error('用户组不存在', 404);
            }
            
            // 检查是否有用户使用该用户组
            $userCount = Db::name('admin')
                ->where('group_id', $id)
                ->count();
            
            if ($userCount > 0) {
                return $this->error('该用户组下有' . $userCount . '个用户，不能删除', 400);
            }
            
            // 删除用户组
            Db::name('admin_group')->where('id', $id)->delete();
            
            return $this->deleted('用户组删除成功');
        } catch (\Exception $e) {
            return $this->error('删除失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 数据验证
     */
    private function validateGroupData($data, $id = 0)
    {
        if (empty($data['title'])) {
            return '用户组名称不能为空';
        }
        
        if (strlen(trim($data['title'])) < 2) {
            return '用户组名称不能少于2个字符';
        }
        
        if (strlen(trim($data['title'])) > 50) {
            return '用户组名称不能超过50个字符';
        }
        
        // 校验权限节点是否存在
        if (isset($data['rules']) && is_array($data['rules'])) {
            $validRules = Db::name('admin_rule')
                ->whereIn('id', array_filter($data['rules']))
                ->column('id');
            
            $invalidRules = array_diff(array_filter($data['rules']), $validRules);
            if (!empty($invalidRules)) {
                return '权限节点ID不存在：' . implode(',', $invalidRules);
            }
        }
        
        return true;
    }
    
    /**
     * 获取启用的用户组列表（用于设置）
     * GET /api/user/group/active-list
     */
    public function activeList()
    {
        try {
            // 查询启用的用户组列表
            $list = Db::name('admin_group')
                ->field('id, title, desc')
                ->where('status', 1)
                ->order('create_time', 'asc')
                ->select()
                ->each(function($item) {
                    // 计算权限节点数量
                    if (!empty($item['rules'])) {
                        $rulesArray = explode(',', trim($item['rules'], ','));
                        $item['rules_count'] = count(array_filter($rulesArray));
                    } else {
                        $item['rules_count'] = 0;
                    }
                    return $item;
                })
                ->toArray();
            
            return $this->success($list, '获取活动用户组列表成功');
        } catch (\Exception $e) {
            return $this->error('查询失败: ' . $e->getMessage(), 500);
        }
    }
    
    /**
     * 批量更新用户组状态
     * POST /api/user/group/batch-status
     */
    public function batchStatus()
    {
        try {
            $param = Request::param();
            $ids = $param['ids'] ?? [];
            $status = (int)($param['status'] ?? 1);
            
            if (empty($ids) || !is_array($ids)) {
                return $this->paramError('请选择要操作的用户组');
            }
            
            // 权限检查
            if (!$this->checkSuperAdmin()) {
                return $this->error('只有系统超级管理员才有权限操作用户组！', 403);
            }
            
            // 批量更新状态
            $updateCount = Db::name('admin_group')
                ->whereIn('id', $ids)
                ->update([
                    'status' => $status,
                    'update_time' => time()
                ]);
            
            $statusName = $status == 1 ? '启用' : '禁用';
            return $this->success(['count' => $updateCount], '成功' . $statusName . $updateCount . '个用户组');
        } catch (\Exception $e) {
            return $this->error('操作失败: ' . $e->getMessage(), 500);
        }
    }
    
    // === 向后兼容方法 ===
    
    /**
     * 向后兼容：获取用户组列表
     */
    public function list()
    {
        return $this->index();
    }
    
    /**
     * 向后兼容：查看用户组详情
     */
    public function group_view()
    {
        return $this->read();
    }
    
    /**
     * 向后兼容：创建用户组
     */
    public function group_add()
    {
        return $this->save();
    }
    
    /**
     * 向后兼容：编辑用户组
     */
    public function group_edit()
    {
        return $this->update();
    }
    
    /**
     * 向后兼容：删除用户组
     */
    public function group_del()
    {
        return $this->delete();
    }
}